"use strict";
module.exports = {
    rules: {
        // 强制在数组开括号后和闭括号前换行
        'array-bracket-newline': 'off',
        // 方括号内部两侧无空格-数组
        'array-bracket-spacing': ['error', 'never'],
        // 强制数组元素间换行
        'array-element-newline': 'off',
        // 单行代码块的大括号内部两侧有空格
        'block-spacing': ['error', 'always'],
        // 大括号换行风格：one true brace style 风格，且单行代码块可不换行
        'brace-style': ['error', '1tbs', { allowSingleLine: true }],
        // 使用小驼峰命名风格
        camelcase: 'off',
        // 强制或禁止对注释的第一个字母大写
        'capitalized-comments': 'off',
        // 用逗号分隔的多行结构，始终加上最后一个逗号（单行不用）
        'comma-dangle': ['error', 'always-multiline'],
        // 逗号的前面无空格，后面有空格
        'comma-spacing': ['error', { before: false, after: true }],
        // 用逗号分隔的多行结构，将逗号放到行尾
        'comma-style': ['error', 'last'],
        // 方括号内部两侧无空格-计算属性
        'computed-property-spacing': ['error', 'never'],
        // 使用一致的 this 别名
        'consistent-this': 'off',
        // 在文件末尾保留一行空行
        'eol-last': ['warn', 'always'],
        // 函数名与调用它的括号间无空格
        'func-call-spacing': ['error', 'never'],
        // 要求函数名与赋值给它们的变量名或属性名相匹配
        'func-name-matching': [
            'off',
            'always',
            {
                includeCommonJSModuleExports: false,
            },
        ],
        // 要求或禁止命名的函数表达式
        'func-names': 'off',
        // 强制只能使用函数声明或函数表达式
        'func-style': 'off',
        // 在函数的小括号内使用一致的换行风格
        'function-paren-newline': ['error', 'consistent'],
        // 禁用指定的标识符
        'id-blacklist': 'off',
        // 强制标识符的最小和最大长度
        'id-length': 'off',
        // 要求标识符匹配一个指定的正则表达式
        'id-match': 'off',
        // 隐式返回的箭头函数体不要换行
        // @reason 同 prettier 有冲突
        'implicit-arrow-linebreak': ['off', 'beside'],
        // 使用 2 个空格缩进
        // @unessential
        indent: [
            'error',
            2,
            {
                SwitchCase: 1,
                VariableDeclarator: 1,
                outerIIFEBody: 1,
                // MemberExpression: null,
                FunctionDeclaration: {
                    parameters: 1,
                    body: 1,
                },
                FunctionExpression: {
                    parameters: 1,
                    body: 1,
                },
                CallExpression: {
                    arguments: 1,
                },
                ArrayExpression: 1,
                ObjectExpression: 1,
                ImportDeclaration: 1,
                flatTernaryExpressions: false,
                // list derived from https://github.com/benjamn/ast-types/blob/HEAD/def/jsx.js
                ignoredNodes: [
                    'JSXElement',
                    'JSXElement > *',
                    'JSXAttribute',
                    'JSXIdentifier',
                    'JSXNamespacedName',
                    'JSXMemberExpression',
                    'JSXSpreadAttribute',
                    'JSXExpressionContainer',
                    'JSXOpeningElement',
                    'JSXClosingElement',
                    'JSXText',
                    'JSXEmptyExpression',
                    'JSXSpreadChild',
                ],
                ignoreComments: false,
            },
        ],
        // JSX 属性使用双引号，不要使用单引号
        // @unessential
        'jsx-quotes': ['error', 'prefer-double'],
        // 定义对象字面量时，key, value 之间有且只有一个空格
        'key-spacing': ['error', { beforeColon: false, afterColon: true }],
        // 关键字前后各一个空格
        'keyword-spacing': [
            'error',
            {
                before: true,
                after: true,
                overrides: {
                    return: { after: true },
                    throw: { after: true },
                    case: { after: true },
                },
            },
        ],
        // 单行注释应单独一行写在被注释对象的上方，不要追加在某条语句的后面
        'line-comment-position': [
            'off',
            {
                position: 'above',
                ignorePattern: '',
                applyDefaultPatterns: true,
            },
        ],
        // 指定 unix 或 windows 风格的换行符
        'linebreak-style': 'off',
        // 类成员之间保留一个空行
        'lines-between-class-members': ['off', 'always', { exceptAfterSingleLine: false }],
        // 要求在注释周围有空行
        'lines-around-comment': 'off',
        // 控制语句的嵌套层级不要过深，不要超过 4 级
        // @reason 适合做后置检查
        'max-depth': ['off', 4],
        // 单行最大字符数：100
        'max-len': [
            'warn',
            100,
            2,
            {
                ignoreUrls: true,
                ignoreComments: false,
                ignoreRegExpLiterals: true,
                ignoreStrings: true,
                ignoreTemplateLiterals: true,
            },
        ],
        // 文件最大行数：1000
        // @reason 适合做后置检查
        'max-lines': [
            'off',
            {
                max: 1000,
                skipBlankLines: true,
                skipComments: true,
            },
        ],
        // 函数最大行数：80
        // @reason 适合做后置检查
        'max-lines-per-function': [
            'off',
            {
                max: 80,
                skipBlankLines: true,
                skipComments: true,
                IIFEs: true,
            },
        ],
        // 回调函数最大嵌套深度
        'max-nested-callbacks': 'off',
        // 函数参数数量上限
        'max-params': ['off', 3],
        // 函数块最多允许的的语句数量
        'max-statements': ['off', 10],
        // 每一行中所允许的最大语句数量
        'max-statements-per-line': ['off', { max: 1 }],
        // 多行注释的风格
        'multiline-comment-style': ['off', 'starred-block'],
        // 要求或禁止在三元操作数中间换行
        'multiline-ternary': ['off', 'never'],
        // 使用大驼峰风格命名类和构造函数
        'new-cap': [
            'error',
            {
                newIsCap: true,
                newIsCapExceptions: [],
                capIsNew: false,
                capIsNewExceptions: ['Immutable.Map', 'Immutable.Set', 'Immutable.List'],
            },
        ],
        // 禁止在调用构造函数时省略小括号
        'new-parens': 'error',
        // 在长方法链式调用时进行换行
        'newline-per-chained-call': ['warn', { ignoreChainWithDepth: 4 }],
        // 不要使用 new Array() 和 Array() 创建数组，除非为了构造某一长度的空数组。
        'no-array-constructor': 'error',
        // 不要使用按位操作符
        'no-bitwise': 'warn',
        // 禁用 continue 语句
        'no-continue': 'off',
        // 禁止行内注释
        'no-inline-comments': 'off',
        // 禁止 if 作为唯一语句出现在 else 中，此时应写成 else if
        'no-lonely-if': 'error',
        // 混合使用多种操作符时，用小括号包裹分组
        'no-mixed-operators': [
            'error',
            {
                groups: [
                    ['%', '**'],
                    ['%', '+'],
                    ['%', '-'],
                    ['%', '*'],
                    ['%', '/'],
                    ['**', '+'],
                    ['**', '-'],
                    ['**', '*'],
                    ['**', '/'],
                    ['&', '|', '^', '~', '<<', '>>', '>>>'],
                    ['==', '!=', '===', '!==', '>', '>=', '<', '<='],
                    ['&&', '||'],
                    ['in', 'instanceof'],
                ],
                allowSamePrecedence: false,
            },
        ],
        // 不要混用空格和 tab
        'no-mixed-spaces-and-tabs': 'error',
        // 禁止连续赋值
        'no-multi-assign': ['error'],
        // 禁止出现多个（大于 2 个）连续空行
        'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 1 }],
        // 禁用否定的表达式
        'no-negated-condition': 'off',
        // 不要使用嵌套的三元表达式
        'no-nested-ternary': 'error',
        // 使用字面量创建对象
        'no-new-object': 'error',
        // 不要使用一元自增自减运算符
        'no-plusplus': ['off', { allowForLoopAfterthoughts: true }],
        // 禁用特定的语法
        'no-restricted-syntax': 'off',
        // 禁止使用 tab
        'no-tabs': 'error',
        // 禁用三元操作符
        'no-ternary': 'off',
        // 行尾不要留有空格
        'no-trailing-spaces': [
            'error',
            {
                skipBlankLines: false,
                ignoreComments: false,
            },
        ],
        // 命名不要以下划线开头或结尾
        'no-underscore-dangle': 'off',
        // 避免不必要的三元表达式
        'no-unneeded-ternary': ['error', { defaultAssignment: false }],
        // 禁止属性调用前有空格
        'no-whitespace-before-property': 'error',
        // 省略大括号的单行语句前不要换行
        'nonblock-statement-body-position': ['error', 'beside', { overrides: {} }],
        // 强制大括号内换行符的一致性
        'object-curly-newline': 'off',
        // 大括号内部两侧有空格
        'object-curly-spacing': ['error', 'always'],
        // 对象的属性需遵循一致的换行风格：即所有属性要么都换行，要么都写在一行
        'object-property-newline': [
            'error',
            {
                allowAllPropertiesOnSameLine: true,
            },
        ],
        // 一条声明语句声明一个变量
        'one-var': ['error', 'never'],
        // 一行声明一个变量
        'one-var-declaration-per-line': ['error', 'always'],
        // 尽可能使用简写形式的赋值操作符
        'operator-assignment': ['warn', 'always'],
        // 强制操作符使用一致的换行符
        'operator-linebreak': 'off',
        // 块的开始和结束不能是空行
        'padded-blocks': ['warn', { blocks: 'never', classes: 'never', switches: 'never' }],
        // 要求或禁止在语句间填充空行
        'padding-line-between-statements': 'off',
        // 使用扩展运算符替代 Object.assign
        'prefer-object-spread': 'off',
        // 对象字面量的属性名不要用引号包裹，除非包含特殊字符
        'quote-props': ['error', 'as-needed', { keywords: false, unnecessary: true, numbers: false }],
        // 字符串优先使用单引号
        quotes: ['error', 'single', { avoidEscape: true }],
        // 使用 JSDoc 注释
        'require-jsdoc': 'off',
        // 使用分号
        // @unessential
        semi: ['error', 'always'],
        // 分号的前面无空格，后面有空格
        'semi-spacing': ['error', { before: false, after: true }],
        // 分号必须写在行尾
        // @unessential
        'semi-style': ['error', 'last'],
        // 要求对对象属性名排序
        'sort-keys': ['off', 'asc', { caseSensitive: false, natural: true }],
        // 要求对变量声明排序
        'sort-vars': 'off',
        // 块的左大括号前有一个空格
        'space-before-blocks': 'error',
        // 函数声明时，对于命名函数，参数的小括号前无空格；对于匿名函数和 async 箭头函数，参数的小括号前有空格
        'space-before-function-paren': [
            'error',
            {
                anonymous: 'always',
                named: 'never',
                asyncArrow: 'always',
            },
        ],
        // 小括号内部两侧无空格
        'space-in-parens': ['error', 'never'],
        // 中缀操作符两侧有空格
        'space-infix-ops': 'error',
        // 一元操作符两侧无空格，包括 -、+、--、++、!、!!
        'space-unary-ops': [
            'error',
            {
                words: true,
                nonwords: false,
                overrides: {},
            },
        ],
        // 注释内容和注释符之间需留有一个空格
        'spaced-comment': [
            'error',
            'always',
            {
                line: {
                    exceptions: ['-', '+'],
                    markers: ['=', '!', '/'],
                },
                block: {
                    exceptions: ['-', '+'],
                    markers: ['=', '!'],
                    balanced: true,
                },
            },
        ],
        // switch 的 case 和 default 子句冒号前面无空格，后面有空格
        'switch-colon-spacing': ['error', { after: true, before: false }],
        // 模板字符串的 tag 后面无空格
        'template-tag-spacing': ['error', 'never'],
        // 要求或禁止 Unicode 字节顺序标记 (BOM)
        'unicode-bom': ['off', 'never'],
        // 要求正则表达式被括号括起来
        'wrap-regex': 'off',
    },
};
